Skip to content
This repository has been archived by the owner on Apr 16, 2021. It is now read-only.

Report actual read count instead of buffer size during transfer #82

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

wrosenuance
Copy link

@wrosenuance wrosenuance commented Feb 7, 2021

During large uploads to an Azure Blob Container I received errors like:

[WARNING] Encountered issue during deployment: Failed to deploy artifacts: Could not transfer artifact blahblah from/to repo-id (bs://blob-artifacts/libs-snapshot/): IndexOutOfBoundsException

Running Maven with debug logging showed several warnings:

[DEBUG] Failed to dispatch transfer event 'PUT PROGRESSED bs://blob-artifacts/libs-snapshot/blah/blahblah/1.0.0-SNAPSHOT/blahblah-1.0.0-20210207.042725-1.pom <> C:\Java\blahblah\pom.xml' to org.apache.maven.cli.transfer.ConsoleMavenTransferListener java.lang.IllegalArgumentException: progressed file size cannot be greater than size: 10054 > 5027 at org.apache.commons.lang3.Validate.isTrue (Validate.java:158) at org.apache.maven.cli.transfer.AbstractMavenTransferListener$FileSizeFormat.formatProgress (AbstractMavenTransferListener.java:195) at org.apache.maven.cli.transfer.ConsoleMavenTransferListener.getStatus (ConsoleMavenTransferListener.java:117) at org.apache.maven.cli.transfer.ConsoleMavenTransferListener.transferProgressed (ConsoleMavenTransferListener.java:90) at org.eclipse.aether.internal.impl.SafeTransferListener.transferProgressed (SafeTransferListener.java:105) at org.eclipse.aether.connector.basic.TransferTransportListener.transportProgressed (TransferTransportListener.java:95) at org.eclipse.aether.transport.wagon.WagonTransferListener.transferProgress (WagonTransferListener.java:64) at com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.lambda$fireTransferProgress$2 (TransferListenerContainerImpl.java:75) at java.util.Vector.forEach (Vector.java:1275) at com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.fireTransferProgress (TransferListenerContainerImpl.java:75) at com.gkatzioura.maven.cloud.transfer.TransferProgressImpl.progress (TransferProgressImpl.java:36) at com.gkatzioura.maven.cloud.transfer.TransferProgressFileInputStream.read (TransferProgressFileInputStream.java:75) at java.io.FilterInputStream.read (FilterInputStream.java:133) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1364) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1293) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1257) at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry (ExecutionEngine.java:99) at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadFullBlob (CloudBlockBlob.java:892) at com.microsoft.azure.storage.blob.CloudBlockBlob.upload (CloudBlockBlob.java:722) at com.microsoft.azure.storage.blob.CloudBlockBlob.upload (CloudBlockBlob.java:601) at com.gkatzioura.maven.cloud.abs.AzureStorageRepository.put (AzureStorageRepository.java:123) at com.gkatzioura.maven.cloud.abs.AzureStorageWagon.put (AzureStorageWagon.java:95) at org.eclipse.aether.transport.wagon.WagonTransporter$PutTaskRunner.run (WagonTransporter.java:686) at org.eclipse.aether.transport.wagon.WagonTransporter.execute (WagonTransporter.java:435) at org.eclipse.aether.transport.wagon.WagonTransporter.put (WagonTransporter.java:418) at org.eclipse.aether.connector.basic.BasicRepositoryConnector$PutTaskRunner.runTask (BasicRepositoryConnector.java:554) at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run (BasicRepositoryConnector.java:363) at org.eclipse.aether.connector.basic.BasicRepositoryConnector.put (BasicRepositoryConnector.java:287) at org.eclipse.aether.internal.impl.DefaultDeployer.deploy (DefaultDeployer.java:295) at org.eclipse.aether.internal.impl.DefaultDeployer.deploy (DefaultDeployer.java:211) at org.eclipse.aether.internal.impl.DefaultRepositorySystem.deploy (DefaultRepositorySystem.java:371) at org.apache.maven.shared.transfer.artifact.deploy.internal.Maven31ArtifactDeployer.deploy (Maven31ArtifactDeployer.java:122) at org.apache.maven.shared.transfer.artifact.deploy.internal.DefaultArtifactDeployer.deploy (DefaultArtifactDeployer.java:79) at org.apache.maven.shared.transfer.project.deploy.internal.DefaultProjectDeployer.deploy (DefaultProjectDeployer.java:190) at org.apache.maven.shared.transfer.project.deploy.internal.DefaultProjectDeployer.deploy (DefaultProjectDeployer.java:134) at org.apache.maven.plugins.deploy.DeployMojo.deployProject (DeployMojo.java:193) at org.apache.maven.plugins.deploy.DeployMojo.execute (DeployMojo.java:177) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288) at org.apache.maven.cli.MavenCli.main (MavenCli.java:192) at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)

The reported IndexOutOfBoundsException appeared to happen during a subsequent attempt to use the byte buffer with an incorrect length:

java.lang.IndexOutOfBoundsException at java.nio.ByteBuffer.wrap (ByteBuffer.java:375) at org.eclipse.aether.transport.wagon.WagonTransferListener.transferProgress (WagonTransferListener.java:64) at com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.lambda$fireTransferProgress$2 (TransferListenerContainerImpl.java:75) at java.util.Vector.forEach (Vector.java:1275) at com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.fireTransferProgress (TransferListenerContainerImpl.java:75) at com.gkatzioura.maven.cloud.transfer.TransferProgressImpl.progress (TransferProgressImpl.java:36) at com.gkatzioura.maven.cloud.transfer.TransferProgressFileInputStream.read (TransferProgressFileInputStream.java:78) at java.io.FilterInputStream.read (FilterInputStream.java:133) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1392) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1293) at com.microsoft.azure.storage.blob.BlobOutputStreamInternal.write (BlobOutputStreamInternal.java:663) at com.microsoft.azure.storage.blob.CloudBlockBlob.upload (CloudBlockBlob.java:754) at com.microsoft.azure.storage.blob.CloudBlockBlob.upload (CloudBlockBlob.java:601) at com.gkatzioura.maven.cloud.abs.AzureStorageRepository.put (AzureStorageRepository.java:123) at com.gkatzioura.maven.cloud.abs.AzureStorageWagon.put (AzureStorageWagon.java:95) at org.eclipse.aether.transport.wagon.WagonTransporter$PutTaskRunner.run (WagonTransporter.java:686) at org.eclipse.aether.transport.wagon.WagonTransporter.execute (WagonTransporter.java:435) at org.eclipse.aether.transport.wagon.WagonTransporter.put (WagonTransporter.java:418) at org.eclipse.aether.connector.basic.BasicRepositoryConnector$PutTaskRunner.runTask (BasicRepositoryConnector.java:554) at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run (BasicRepositoryConnector.java:363) at org.eclipse.aether.connector.basic.BasicRepositoryConnector.put (BasicRepositoryConnector.java:287) at org.eclipse.aether.internal.impl.DefaultDeployer.deploy (DefaultDeployer.java:295) at org.eclipse.aether.internal.impl.DefaultDeployer.deploy (DefaultDeployer.java:211) at org.eclipse.aether.internal.impl.DefaultRepositorySystem.deploy (DefaultRepositorySystem.java:371) at org.apache.maven.shared.transfer.artifact.deploy.internal.Maven31ArtifactDeployer.deploy (Maven31ArtifactDeployer.java:122) at org.apache.maven.shared.transfer.artifact.deploy.internal.DefaultArtifactDeployer.deploy (DefaultArtifactDeployer.java:79) at org.apache.maven.shared.transfer.project.deploy.internal.DefaultProjectDeployer.deploy (DefaultProjectDeployer.java:190) at org.apache.maven.shared.transfer.project.deploy.internal.DefaultProjectDeployer.deploy (DefaultProjectDeployer.java:134) at org.apache.maven.plugins.deploy.DeployMojo.deployProject (DeployMojo.java:193) at org.apache.maven.plugins.deploy.DeployMojo.execute (DeployMojo.java:177) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288) at org.apache.maven.cli.MavenCli.main (MavenCli.java:192) at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)

This appears to relate to misreporting of the buffer size length in TransferProgressFileInputStream: the code assumed that every call to read would completely fill the requested length, rather than checking and reporting the byte count returned from super.read(). This PR fixes these issues by checking the returned bytes read. I expect this fixes #50.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
1 participant